package com.munichosica.myapp.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.munichosica.myapp.dao.AlmacenTiendaDao;
import com.munichosica.myapp.dto.Almacen;
import com.munichosica.myapp.dto.AlmacenTienda;
import com.munichosica.myapp.dto.Tienda;
import com.munichosica.myapp.exceptions.AlmacenDaoException;
import com.munichosica.myapp.exceptions.AlmacenTiendaDaoException;

public class AlmacenTiendaDaoImpl implements AlmacenTiendaDao{
	private StringBuilder sql=null;
	private StringBuilder sqlSelect=null; 
	
	public AlmacenTiendaDaoImpl() {
		sql=new StringBuilder();
		sqlSelect=new StringBuilder();
	}
	
	@Override
	public void insertar(AlmacenTienda almacenTienda)
			throws AlmacenTiendaDaoException {
		sql.append("INSERT INTO almacen_tienda (almcodigo_i, tiecodigo_i, altestado_c) VALUES (?, ?, ?)");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setInt(1, almacenTienda.getAlmacen().getAlmcodigoI());
			stmt.setInt(2, almacenTienda.getTienda().getTiecodigoI());
			stmt.setString(3, almacenTienda.getAltestado());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new AlmacenTiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

	@Override
	public void eliminar(AlmacenTienda almacenTienda)
			throws AlmacenTiendaDaoException {
		sql.append("UPDATE almacen_tienda SET altestado_c='I' WHERE almcodigo_i=? and tiecodigo_i=? ");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setInt(1, almacenTienda.getAlmacen().getAlmcodigoI());
			stmt.setInt(2, almacenTienda.getTienda().getTiecodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new AlmacenTiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

	@Override
	public List<AlmacenTienda> listar(Integer almcodigo, String estado)
			throws AlmacenTiendaDaoException {
		sqlSelect.append("SELECT TIE.TIECODIGO_I AS CODIGO, " +
				"TIE.TIENOMBRE_V AS TIENDA, " +
				"TIE.TIEDIRECCION_V AS DIRECCION, " +
				"TIE.TIETELEFONO_V AS TELEFONO," +
				"TIE.TIEESTADO_C AS ESTADO " +
				"FROM TIENDA TIE " +
				"INNER JOIN ALMACEN_TIENDA ALT ON ALT.TIECODIGO_I=TIE.TIECODIGO_I " +
				"INNER JOIN ALMACEN ALM ON ALM.ALMCODIGO_I=ALT.ALMCODIGO_I " +
				"WHERE ALT.ALMCODIGO_I=?  " +
				"AND ALT.ALTESTADO_C LIKE '%"+estado.trim()+"%' " +
				"AND TIE.TIEESTADO_C!='I' " +
				"AND ALM.ALMESTADO_C!='I' ");
		
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		List<AlmacenTienda> lista=null;
		try {
			System.out.println(sqlSelect.toString());
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sqlSelect.toString());
			stmt.setInt(1, almcodigo);
			boolean results=stmt.execute();
			if(results){
				lista=new ArrayList<AlmacenTienda>();
				rs=stmt.getResultSet();
				AlmacenTienda almacenTienda=null;
				while(rs.next()){
					almacenTienda=new AlmacenTienda();
					almacenTienda.getTienda().setTiecodigoI(rs.getInt("CODIGO"));
					almacenTienda.getTienda().setTienombreV(rs.getString("TIENDA"));
					almacenTienda.getTienda().setTiedireccionV(rs.getString("DIRECCION"));
					almacenTienda.getTienda().setTietelefonoV(rs.getString("TELEFONO"));
					almacenTienda.getTienda().setTieestadoC(rs.getString("ESTADO"));
					lista.add(almacenTienda);
				}
			}
		} catch (SQLException e) {
			throw new AlmacenTiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return lista;
	}

	@Override
	public List<Tienda> listarTiendasNoAgregadasEnAlmacen(
			Integer almcodigo) throws AlmacenTiendaDaoException {
		sqlSelect.append("select tiecodigo_i as codigo, " +
				"tienombre_v as tienda " +
				"from tienda " +
				"where tiecodigo_i not in ( " +
				"select tiecodigo_i " +
				"from almacen_tienda " +
				"where almcodigo_i=? )");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		List<Tienda> lista=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sqlSelect.toString());
			stmt.setInt(1, almcodigo);
			boolean results=stmt.execute();
			if(results){
				lista=new ArrayList<Tienda>();
				rs=stmt.getResultSet();
				Tienda tienda=null;
				while(rs.next()){
					tienda=new Tienda();
					tienda.setTiecodigoI(rs.getInt("codigo"));
					tienda.setTienombreV(rs.getString("tienda"));
					lista.add(tienda);
				}
			}
		} catch (SQLException e) {
			throw new AlmacenTiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return lista;
	}

	@Override
	public void modificar(AlmacenTienda almacenTienda)
			throws AlmacenTiendaDaoException {
		sql.append("UPDATE almacen_tienda SET altestado_c=? WHERE almcodigo_i=? and tiecodigo_i=? ");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, almacenTienda.getAltestado());
			stmt.setInt(2, almacenTienda.getAlmacen().getAlmcodigoI());
			stmt.setInt(3, almacenTienda.getTienda().getTiecodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new AlmacenTiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

}
